package com.erdos.common.service;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.erdos.common.pagination.Page;


public interface BaseService<T> extends Serializable {
    
	public static final String PRE_INSERT = "insert";

	public static final String PRE_UPDATE = "update";

	public static final String PRE_DELETE = "delete";

	public static final String PRE_FIND = "find";
	
	public static final String PRE_FIND_ALL = "findAll";
	
	public static final String PRE_FIND_BY_PK = "findByPrimaryKey";

	/**
	 * 分页查询
	 * @param params 放置参数的Map对象，key=参数名，value=参数值
	 * @param pageNo 查询页码 
	 * @param limit 每页限定记录数
	 * @return 组装好的Page对象 @see com.hp.common.pagination.Page
	 */
	public Page<T> findByPage(Map<String, Object> params, int pageNo, int limit);

	/**
	 * 创建实体对象
	 * @param entity
	 * @return TODO
	 */
	public Long insert(T entity);

	/**
	 * 批量创建实体对象，采用Btach批量处理机制
	 * @param collection
	 */
	public void insertAll(final Collection<T> collection);

	/**
	 * 更新实体对象
	 * @param entity
	 */
	public void update(T entity);

	/**
	 * 批量更新实体对象，采用Btach批量处理机制
	 * @param collection
	 */
	public void updateAll(final Collection<T> collection);

	/**
	 * 查询全部记录
	 * @return 记录集合
	 */
	public List<T> findAll();

	/**
	 * 删除实体对象
	 * @param entity
	 */
	public int delete(T entity);
	
	/**
	 * 根据主键删除实体对象
	 * @param entity
	 */
	public int deleteByPrimaryKey(Long sid);

	/**
	 * 批量删除实体对象，采用Btach批量处理机制
	 * @param collection
	 */
	public void deleteAll(final Collection<T> collection);
	
	/**
	 * 根据主键批量删除实体对象，采用Btach批量处理机制
	 * @param collection
	 */
	public void deleteAllByPrimaryKey(final Collection<Long> sids);

	/**
	 * 根据主键返回唯一对象
	 * @param sid 序列主键
	 * @return 实体对象
	 */
	public T findByPrimaryKey(Long sid);

	/**
	 * 根据主键数组返回一批对象
	 * @param sids 序列主键数组
	 * @return 实体对象链表
	 */
	public List<T> findByPrimaryKeys(Long[] sids);

	/**
	 * 根据参数返回一个实体对象，一般用于查询具有唯一约束条件的记录
	 * 必须保证传入的参数确实能定位唯一一个对象，否则将iBatis会抛出运行异常
	 * @param params 参数Map对象
	 * @return 实体对象 
	 */
	public T findUniqueByParams(Map<String, Object> params);

	/**
	 * 根据参数返回实体对象集合
	 * @param params 参数Map对象
	 * @return 实体对象链表
	 */
	public List<T> findByParams(Map<String, Object> params);
	
	
	/**
	 * 直接传入SQL Mapping ID和Map参数查询对象
	 * 主要用于一些帮助方法调用，调用者根据负责自行进行类型转型
	 * @param sqlID SQL Mapping ID
	 * @param params 参数Map对象
	 * @return
	 */
	public Object findObjectBySqlID(String sqlID,Map<String, Object> params);
	
	/**
	 * 直接传入SQL Mapping ID和Map参数查询集合
	 * 主要用于一些帮助方法调用，调用者根据负责自行进行类型转型
	 * @param sqlID SQL Mapping ID
	 * @param params 参数Map对象
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List findListBySqlID(String sqlID,Map<String, Object> params);
	
	/**
	 * 插入当前实体对象到历史记录表
	 * @param params
	 * @author xiali2
	 * @since  2008-8-5
	 */
	public void insertHistory(Map<String,Object> params);
}

